package com.spsa.persistencia.dao;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.spsa.excepciones.ActualizarDatosException;
import com.spsa.excepciones.EliminarDatosException;
import com.spsa.excepciones.GuardarDatosException;
import com.spsa.excepciones.RecuperarDatosException;
import com.spsa.persistencia.entidades.Destinatario;

@Stateless
public class DestinatarioDao {

	static final Logger logger = LogManager.getLogger(DestinatarioDao.class.getName());

	@PersistenceContext(unitName = "Notificacion")
	private EntityManager em;

	public List<Destinatario> listar() throws RecuperarDatosException {
		try {
			Query query = em.createQuery("SELECT d FROM Destinatario d");
			List<Destinatario> destinatarios = query.getResultList();
			return destinatarios;
		} catch (Exception e) {
			logger.fatal("No se pudo recuperar la lista de Destinatarios de la BD", e);
			throw new RecuperarDatosException("No se pudo recuperar la lista de Destinatarios de la BD");
		}
	}

	public void guardar(Destinatario destinatario) throws GuardarDatosException {
		try {
			em.persist(destinatario);
		}
		catch(EntityExistsException e) {
			logger.error("Se quiso registrar un destinatario con un ID repetido: " + destinatario);
			throw new GuardarDatosException("Ya existe un destinatario con el mismo ID");
		}
		catch (Exception e) {
			logger.error("Error al registrar el destinatario en la BD: " + destinatario, e);
			throw new GuardarDatosException("Error al registrar el destinatario en la BD");
		}
	}
	
	public void actualizar(Destinatario destinatario) throws ActualizarDatosException {
		try {
			em.merge(destinatario);
		}
		catch (Exception e) {
			logger.error("Error al actualizar el destinatario en la BD: " + destinatario, e);
			throw new ActualizarDatosException("Error al actualizar el destinatario en la BD");
		}
	}
	
	public boolean existe(Long id) throws RecuperarDatosException{
		try {
			return em.find(Destinatario.class, id) != null;
		}
		catch(Exception e) {
			logger.error("Error al buscar el usuario con ID " + id + " en la BD", e);
			throw new RecuperarDatosException("Error al buscar el usuario con ID " + id + " en la BD");
		}
	}
	
	public void eliminar(Destinatario destinatario) throws EliminarDatosException{
		try {
			destinatario = em.find(Destinatario.class, destinatario.getId());
			em.remove(destinatario);
		} catch (Exception e) {
			logger.fatal("No se pudo eliminar un destinatario de la BD: " + destinatario, e);
			throw new EliminarDatosException("No se pudo eliminar un Destinatario de la BD: " + destinatario);
		}
	}
}
